s="42"
def calculate(s: str) -> int:
    #定义运算符的优先级
    map={'-':1,'+':1,'*':2,'/':2,'%':2,'^':3}
    # 创建一个栈，用来存放所有的数字
    numsStack=[]
    #为了防止第一个数是负数，先往nums里面价加一个0
    numsStack.append(0)
    #创建另一个栈，用来存放非数字的操作
    signalStack=[]
    #循环遍历字符串
    i=0
    while i<len(s):
        e=s[i]
        if e=='(':
            #如果是左括号
            signalStack.append(e)
        elif e==")":
            #右括号的情况，计算到最近的一个左括号为止
            while len(signalStack)>0:
                if signalStack[len(signalStack)-1]!="(":
                    #计算，这中间的各个运算符
                    calc(numsStack,signalStack)
                else:
                    #是左括号，就把左括号弹出来即可
                    signalStack.pop()
                    break
        else:
            if e.isnumeric():
                #数字的情况
                print("走这里:",e)
                #e是只有数字组成的
                u=0
                j=i
                #取一个完整的数字出来
                while j<len(s) and s[j].isnumeric():
                    u=u*10+int(s[j])
                    j+=1
                #把整个完整的数字存入到栈中
                numsStack.append(u)
                i=j-1
            else:
                #+-*/%^  也就是各个运算符
                if i>0 and (s[i-1]=="(" or s[i-1]=='+' or s[i-1]=='-'):
                    numsStack.append(0)
                #有一个新操作要入栈时，先把栈内可以算的都算出来
                #只有满足“栈内运算符”比“当前预算符”优先级高/同等级，才可以进行运算
                while len(signalStack)>0 and signalStack[len(signalStack)-1]!='(':
                    prev=signalStack[len(signalStack)-1]
                    if map[prev]>=map[e]:
                        #计算
                        calc(numsStack,signalStack)
                    else:
                        break
                signalStack.append(e)
        i+=1
    while len(signalStack)>0:
        #计算
        calc(numsStack,signalStack)
    return numsStack.pop()

def calc(numsStack,signalStack):
    if len(numsStack)==0 or len(numsStack)<2:
        return None
    if len(signalStack)==0:
        return None
    b=numsStack.pop()
    a=numsStack.pop()
    ops=signalStack.pop()
    # ans=0
    if ops=="+":
        ans=int(a+b)
    elif ops=="-":
        ans=int(a-b)
    elif ops=="*":
        ans=int(a*b)
    elif ops=="/":
        ans=int(a/b)
    elif ops=="^":
        ans=pow(a,b)
    elif ops=="%":
        ans=a%b
    else:
        ans=0
    numsStack.append(ans)
print(calculate(s))